OpenVPN 搭建虚拟局域网
OpenVPN 是一种开源的虚拟私人网络(VPN)软件,它用于创建加密的网络连接。这种加密连接通常被称为VPN隧道,它允许用户在不安全的网络(如互联网)上安全地传输数据。OpenVPN广泛用于远程访问、保护无线网络通信、增强网络安全等多种场景。
服务端安装
sudo apt update
sudo apt upgrade
接下来,安装 OpenVPN 和 Easy-RSA(一个用于生成SSL/TLS证书的工具)。
sudo apt install openvpn easy-rsa
设置 Easy-RSA
需要设置 Easy-RSA 来生成证书和密钥。
复制 Easy-RSA 的示例文件到一个新的目录:
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
初始化 Easy-RSA 环境:
./easyrsa init-pki
构建证书颁发机构(CA):
./easyrsa build-ca
按回车确认你在 vars 文件中设置的信息。
创建服务器证书、密钥和加密参数
生成服务器证书和密钥:
./easyrsa gen-req server nopass
./easyrsa sign-req server server
第一个命令生成服务器的私钥和证书请求文件。第二个命令使用CA签署服务器的证书请求。
输入相关信息,并对两个问题回答“yes”。
生成 Diffie-Hellman 参数:
./easyrsa gen-dh
生成 HMAC 签名以增强 TLS 的完整性验证能力:
openvpn --genkey --secret ta.key
配置 OpenVPN 服务器
首先,需要复制相关的证书和密钥到 OpenVPN 的配置目录。运行以下命令:
sudo cp ~/openvpn-ca/pki/private/server.key /etc/openvpn/
sudo cp ~/openvpn-ca/pki/issued/server.crt /etc/openvpn/
sudo cp ~/openvpn-ca/pki/ca.crt /etc/openvpn/
sudo cp ~/openvpn-ca/pki/dh.pem /etc/openvpn/dh2048.pem
sudo cp ~/openvpn-ca/ta.key /etc/openvpn/
现在,创建 OpenVPN 服务器的配置文件:
sudo vim /etc/openvpn/server.conf
在打开的编辑器中,输入以下配置:
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
keepalive 10 120
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
路由设置: push "redirect-gateway def1 bypass-dhcp" 这行命令会将所有客户端的网络流量都通过 VPN 路由。确保服务器已经开启了 IP 转发,并且已经正确设置了 NAT,以便客户端可以访问互联网。
如果不想将所有流量都通过 VPN 路由,可以注释掉这行命令,然后在客户端配置文件中添加 route 指令,以指定需要通过 VPN 路由的流量。这里注释掉 push "redirect-gateway def1 bypass-dhcp",然后在客户端配置文件中添加以下内容:
;push "redirect-gateway def1 bypass-dhcp"
push "route 10.10.10.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
keepalive 10 120
配置完后,需要加上下面的路由规则,不然客户端无法访问外网
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
启动 OpenVPN 服务
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
# 如果想禁止openvpn@server服务随系统启动而自动运行
sudo systemctl disable openvpn@server
现在,OpenVPN 服务器应该已经在你的 Ubuntu 服务器上运行了。可以使用 sudo systemctl status openvpn@server 命令来检查服务的状态。
修改服务端口
可以修改OpenVPN服务器使用的端口。OpenVPN默认使用UDP协议的1194端口,但你可以根据需要更改为其他端口和协议。以下是如何修改OpenVPN服务器端口的步骤:
1、修改OpenVPN服务器配置文件
sudo vim /etc/openvpn/server.conf
找到port指令,修改其后的数字为你想要使用的端口号。例如,如果你想要将端口更改为443:
port 443
如果你还想要更改使用的协议(默认是UDP),找到 proto 指令,并修改其后的协议。例如,如果你想要使用TCP:
proto tcp
保存并关闭文件。
2、修改防火墙设置
如果你的服务器运行了防火墙,你需要更新防火墙规则,允许流量通过你新设置的端口。
例如,如果你使用UFW,并且你将OpenVPN的端口更改为443,运行:
sudo ufw allow 443/tcp
请确保替换443和tcp为你在OpenVPN配置文件中设置的端口号和协议。
3、重启OpenVPN服务
重启OpenVPN服务以应用更改:
sudo systemctl restart openvpn@server
不要忘记也需要更新所有 OpenVPN 客户端的配置文件,以反映端口和协议的更改。找到客户端配置文件中的 port 和 proto 指令,并进行相应的修改。
保存客户端配置文件后,你应该能够使用新的端口和协议连接到OpenVPN服务器。
客户端安装
访问OpenVPN的官方下载页面:OpenVPN Download Page
然后服务端导出 .ovpn 文件
在服务器上,先为需要为每个客户端创建一个唯一的证书和密钥对。
# 这将为客户端生成一个名为 client1 的证书和密钥。
cd ~/openvpn-ca
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
再创建一个新的 .ovpn 文件:
vim ~/client1.ovpn
在编辑器中输入以下内容:
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
verb 3
<ca>
-----BEGIN CERTIFICATE-----
(你的 CA 证书内容)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
(你的客户端证书内容)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(你的客户端私钥内容)
-----END PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
(ta.key 文件的内容)
-----END OpenVPN Static key V1-----
</tls-auth>
key-direction 1
确保替换 your_server_ip 为你的服务器IP地址或域名,将CA证书、客户端证书、客户端私钥和tls-auth密钥替换为相应的内容。
导出 .ovpn 文件
现在,你已经创建了 .ovpn 配置文件,你可以将其复制到客户端设备上。你可以通过SCP、SFTP或任何其他安全的文件传输方法来完成这个任务。
例如,使用 SCP 从 Windows 客户端复制文件:
scp user@your_server_ip:~/client1.ovpn C:\Path\To\Save\
编写一个自动化脚本
每次像上面那样手动创建一个客户端证书和密钥对是很麻烦的。你可以编写一个脚本来自动化这个过程。
下面是一个简单的 bash 脚本示例,用于自动配置 OpenVPN 客户端并生成 .ovpn 文件。
请注意,这个脚本需要在 OpenVPN 服务器上运行,并且你需要根据你的具体设置调整脚本中的变量和路径。
#!/bin/bash
# 设置变量
EASYRSA_DIR=~/openvpn-ca # Easy-RSA目录的路径
OUTPUT_DIR=~/openvpn-ca/clients/client-configs/files # 输出.ovpn文件的目录
CLIENT_NAME=$1 # 从命令行参数获取客户端名称
# 检查是否提供了客户端名称
if [ -z "$CLIENT_NAME" ]; then
echo "Usage: $0 <client-name>"
exit 1
fi
# 生成客户端证书和密钥
cd $EASYRSA_DIR
./easyrsa gen-req $CLIENT_NAME nopass
./easyrsa sign-req client $CLIENT_NAME
# 创建客户端配置目录
mkdir -p $OUTPUT_DIR
# 内嵌基础OpenVPN客户端配置
BASE_CONFIG="client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
verb 3"
# 生成.ovpn文件
echo "$BASE_CONFIG" > $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo -e '<ca>' >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
cat $EASYRSA_DIR/pki/ca.crt >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo -e '</ca>\n<cert>' >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
cat $EASYRSA_DIR/pki/issued/$CLIENT_NAME.crt >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo -e '</cert>\n<key>' >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
cat $EASYRSA_DIR/pki/private/$CLIENT_NAME.key >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo -e '</key>\n<tls-auth>' >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
cat $EASYRSA_DIR/ta.key >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo -e '</tls-auth>' >> $OUTPUT_DIR/$CLIENT_NAME.ovpn
echo "Client configuration is available at: $OUTPUT_DIR/$CLIENT_NAME.ovpn"
将这个脚本保存为一个文件,比如 generate-client-config.sh,然后赋予它执行权限:
chmod +x generate-client-config.sh
你可以通过运行以下命令来生成一个客户端配置文件:
./generate-client-config.sh client1
这将为名为 client1 的客户端生成一个 .ovpn 文件,并将其保存到 ~/client-configs/files 目录。
注意要修改一下这个文件的部分内容,它里面有些多余的内容需要去掉
请确保你已经创建了一个基础的 OpenVPN 客户端配置文件,并保存为 ~/client-configs/base.conf。这个文件应该包含客户端通用的OpenVPN配置选项。
检查远程的 UDP 端口是否开放
$udpClient = New-Object System.Net.Sockets.UdpClient
try {
$udpClient.Connect("远程IP", 端口)
$bytes = [Text.Encoding]::ASCII.GetBytes("test msg")
$udpClient.Send($bytes, $bytes.Length)
Write-Host "is opne"
} catch {
Write-Host "close"
} finally {
$udpClient.Close()
}
配置 DNS 推送
OpenVPN 允许你通过服务器配置文件推送 DNS 服务器地址到客户端。这样,当客户端连接到 VPN 时,它们将使用指定的 DNS 服务器来解析域名。
要推送 DNS 服务器到OpenVPN客户端,你需要在OpenVPN服务器的配置文件中添加 push "dhcp-option DNS <DNS-Server-IP>" 指令。
以下是如何设置的步骤:
1、打开 OpenVPN 服务器配置文件
你需要使用文本编辑器打开 OpenVPN 服务器的配置文件。这通常位于 /etc/openvpn/server.conf 或 /etc/openvpn/server/server.conf。
sudo vim /etc/openvpn/server.conf
2、添加 DNS 服务器
在配置文件中,添加 push "dhcp-option DNS <DNS-Server-IP>" 指令,将 <DNS-Server-IP> 替换为你想要推送到客户端的 DNS 服务器的 IP 地址。
例如,如果你想要使用 Google 的公共 DNS 服务器,你可以添加:
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
如果你有多个 DNS 服务器,你可以为每个服务器添加一行。
重启 OpenVPN 服务
为了使更改生效,你需要重启 OpenVPN 服务。
sudo systemctl restart openvpn@server
或者如果你的服务名不同,使用相应的服务名。
3、重新连接客户端
客户端需要重新连接到VPN服务器,以获取新的DNS设置。
这样,当客户端连接到OpenVPN服务器时,它们将自动使用你指定的DNS服务器。请确保你推送的DNS服务器是可达的,并且能够正确解析域名。